iT邦幫忙

2022 iThome 鐵人賽

DAY 12
1
Modern Web

.NET教我做人系列 第 12

Day12 經過都需要Middleware的同意

  • 分享至 

  • xImage
  •  

昨天我們用最簡單的方式說明了,在ASP. NET中怎麼去對資料庫座連接的方式與如何在專案下創建資料表的方式,今天的話要來說個很重要的東西「中介軟體」

Pipeline 的概念

ASP. NET Core 要求管線(Pipeline)由要求委派序列組成,並會一個接著一個呼叫。 下圖說明此概念。 執行緒遵循黑色箭號執行

每一個委派皆能在下個委派的前後執行作業。 處理例外狀況的委派必須提前在管線中呼叫,以便其可與管線後續階段中所發生的例外狀況達成一致

Middleware介紹

中介軟體(Middleware)是一類提供系統軟體和應用軟體之間連接、便於軟體各部件之間的溝通的軟體。在ASP. NET中簡單就是在client 傳到 server時中間會經過很多中介軟體,這些中介軟體通常都會扮演不同的角色,例如驗證(Authentication)或這授權(Authorization)等等的功能

註冊方式

middleware的註冊方式在 .NET 6後都放在Program.cs裡坐使用,ASP. NET除了有內建的的Middleware之外,我們也可以用RunUseMap來自訂Middleware

內建中介軟體

內建的中介軟體大都以Use開頭的方式註冊

使用時機 使用方式 資訊
開發人員例外狀況頁面中介軟體 UseDeveloperExceptionPage 回報應用程式執行階段錯誤
資料錯誤頁面中介軟體 UseDatabaseErrorPage 回報資料庫執行階段錯誤
例外狀況處理常式中介軟體 UseExceptionHandler 會攔截在下列中介軟體中擲回的例外狀況
HTTP 靜態傳輸安全性通訊協定 (HSTS) UseHsts 會新增 Strict-Transport-Security 標頭
HTTPS 重新導向中介軟體 UseHttpsRedirection HTTP 要求重新導向到 HTTPS
靜態檔案中介軟體 UseStaticFiles 傳回靜態檔案並縮短進一步的要求處理時間
Cookie 原則中介軟體 UseCookiePolicy 使應用程式符合歐盟一般資料保護歸調 (GDPR) 法規
路由中介軟體 UseRouting 路由要求
驗證中介軟體 UseAuthentication 在安全資源之前先驗證使用者
授權中介軟體 UseAuthorization 可授權使用者存取安全資源
工作階段中介軟體 UseSession 建立並維護工作階段狀態
端點路由中介軟體 UseEndpoints / MapRazorPages 將 Razor Pages 端點新增至要求管線

自訂中介軟體

  • Run:這是會放在Middleware的最後段,通常遇到Run之後就會開始回流,有點像是反轉的點
  • Use:一般Middleware常見的註冊方式,我們可以用next()的方式跑到下一個Middleware
  • Map:主要在判斷路由規則是否符合預期,符合則執行區間內容

中介軟體順序

這裡要特別注意Authentication一定要在Authorization之上,比較多人問題出在這

實作

下面就先舉一個簡單的例子
我們先用前幾天創好的Demo檔,或是自己新增 Webapi,在 Program.cs新增下列

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Use(async (context, next) => {
    await context.Response.WriteAsync("middleware -use request1 \r\n"); // 在Request時會執行
    var condition = true;
    if (condition)
    {
        await next(); // 跑進下一個middleware
    }
    await context.Response.WriteAsync("middleware -use request1 \r\n"); // 在反轉時會執行
});

app.Use(async (context, next) => {
    await context.Response.WriteAsync("middleware -use request2 \r\n");
    var condition = true;
    if (condition)
    {
        await next.Invoke();// 跑進下一個middleware(這裡的會會跑進Run的middleware)
    }
    await context.Response.WriteAsync("middleware -use request2 \r\n");
});
app.Map("/map", applicationBuilder => // 在特路徑時才會跑進這裡的middleware
{
    applicationBuilder.Use(async (context, next) =>
    {
        await context.Response.WriteAsync("middleware -  use test in map1 - request in\n");
        await next.Invoke();
        await context.Response.WriteAsync("middleware -  use test in map1 - response out\n");
    });

    applicationBuilder.Run(async context =>
    {
        await context.Response.WriteAsync("middleware - run test in map1\n");
    });
});

app.Run(async context =>{
    await context.Response.WriteAsync("middleware -run endpoint \r\n");
});

app.Run();

下圖應該會在你執行完後跑出這畫面

沒有進入Map中介軟體時

在進入Map中介軟體時呈現如下,而且在進入Map後並不會跑到最外面的Run中介軟體

參考文章:
https://learn.microsoft.com/zh-tw/aspnet/core/fundamentals/middleware/?view=aspnetcore-6.0
https://ithelp.ithome.com.tw/articles/10259251
https://blog.johnwu.cc/article/ironman-day03-asp-net-core-middleware.html
https://medium.com/@WilliamWhetstone/c-%E4%BD%95%E8%AC%82%E5%A7%94%E6%B4%BE-delegate-e7eec68da4e2


上一篇
Day11 .NET 與資料庫的連結
下一篇
Day13 靜態檔案(Static Files)
系列文
.NET教我做人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言